prettytable-rs
A formatted and aligned table printer library for Rust.
Copyright © 2018 Pierre-Henri Symoneaux
THIS SOFTWARE IS DISTRIBUTED WITHOUT ANY WARRANTY Check LICENSE.txt file for more information.
How to use
- Including
- Basic usage
- Using macros
- Do it with style
- Slicing
- Customize your table look and feel
- CSV import/export
- Note on line endings
Including
Include the library as a dependency to your project by adding the following lines to your Cargo.toml file:
[]
= "^0.6"
The library requires at least rust v1.18.0
.
Basic usage
Start using it like this:
extern crate prettytable;
use Table;
use Row;
use Cell;
The code above will output
+---------+------+---------+
| ABC | DEFG | HIJKLMN |
+---------+------+---------+
| foobar | bar | foo |
+---------+------+---------+
| foobar2 | bar2 | foo2 |
+---------+------+---------+
Using macros
For everyday usage consider table!
macro. This code will produce the same output as above:
extern crate prettytable;
The ptable!
macro combines creating and printing a table:
extern crate prettytable;
Tables also support multiline cells content. As a result, you can print a table into another table (yo dawg ;). For example:
let table1 = table!;
let table2 = table!;
table2.printstd;
will print
+-------------------------+------------------------------+
| Title 1 | Title 2 |
+-------------------------+------------------------------+
| This is | foo |
| a multiline | |
| cell | |
+-------------------------+------------------------------+
| Yo dawg ;) You can even | +---------+------+---------+ |
| print tables | | ABC | DEFG | HIJKLMN | |
| into tables | +---------+------+---------+ |
| | | foobar | bar | foo | |
| | +---------+------+---------+ |
| | | foobar2 | bar2 | foo2 | |
| | +---------+------+---------+ |
+-------------------------+------------------------------+
Rows may have different numbers of cells. The table will automatically adapt to the largest row by printing additional empty cells in smaller rows.
Do it with style!
Tables can have a styled output with background and foreground colors, bold and italic as configurable settings, thanks to the term
crate.
term
style attributes are reexported
-
directly:
use ; /* ... */ table.add_row;
-
through style strings:
table.add_row;
-
using
row!
macro:table.add_row;
-
using
table!
macro (this one creates a new table, unlike previous examples):table!;
Here
- bFg means bold, Foreground: green,
- Bri means Background: red, italic.
Another example: FrBybc means Foreground: red, Background: yellow, bold, center.
All cases of styling cells in macros:
- With
row!
, for each cell separately:row!;
- With
row!
, for the whole row:row!;
- With
table!
, for each cell separately:table!;
- With
table!
, for whole rows:table!;
- With
table!
, mixed styling:table!;
List of style specifiers:
- F : Foreground (must be followed by a color specifier)
- B : Background (must be followed by a color specifier)
- b : bold
- i : italic
- u : underline
- c : Align center
- l : Align left
- r : Align right
- d : default style
List of color specifiers:
Lowercase letters stand for usual colors:
- r : Red
- b : Blue
- g : Green
- y : Yellow
- c : Cyan
- m : Magenta
- w : White
- d : Black
Uppercase letters stand for bright counterparts of the above colors:
- R : Bright Red
- B : Bright Blue
- ... and so on ...
Slicing
Tables can be sliced into immutable borrowed subtables.
Slices are of type prettytable::TableSlice<'a>
.
For example,
use Slice;
/* ... */
let slice = table.slice;
table.printstd;
will print a table with only lines 2, 3 and 4 from table
.
Other Range
syntaxes are supported. For example:
table.slice; // Returns a borrowed immutable table with all rows
table.slice; // Returns a table with rows starting at index 2
table.slice; // Returns a table with rows until the one at index 3
Customize look and feel of a table
The look and feel of a table can be customized with prettytable::format::TableFormat
.
Configurable settings include:
- Borders (left and right)
- Junctions
- Column separators
- Line separators
To do this, either:
- create a new
TableFormat
object, then call setters until you get the desired configuration; - or use the convenient
FormatBuilder
and Builder pattern, shown below
let mut table = /* Initialize table */;
let format = new
.column_separator
.borders
.separators
.padding
.build;
table.set_format;
The code above will make the table look like
+-------------+------------+
| Title 1 | Title 2 |
| Value 1 | Value 2 |
| Value three | Value four |
+-------------+------------+
For convenience, several formats are predefined in prettytable::format::consts
module.
Some formats and their respective outputs:
-
table.set_format;
+-------------+------------+ | Title 1 | Title 2 | +-------------+------------+ | Value 1 | Value 2 | | Value three | Value four | +-------------+------------+
-
table.set_format;
Title 1 | Title 2 ------------+------------ Value 1 | Value 2 Value three | Value four
Check API documentation for the full list of available predefined formats.
CSV import/export
Tables can be imported from and exported to CSV. This is possible thanks to the default & optional feature csv
.
The
csv
feature may become deactivated by default on future major releases.
Importing
A Table
can be imported from a string:
let table = from_csv_string?;
or from CSV files:
let table = from_csv_file?;
Those 2 ways of importing CSV assumes a CSV format with
no headers
, and delimited withcommas
Import can also be done from a CSV reader which allows more customization around the CSV format:
let reader = /* create a reader */;
/* do something with the reader */
let table = from_csv;
Exporting
Export to a generic Write
:
let out = create?;
table.to_csv?;
or to a csv::Writer<W: Write>
:
let writer = /* create a writer */;
/* do something with the writer */
table.to_csv_writer?;
Note on line endings
By default, the library prints tables with platform specific line ending. Thin means on Windows,
newlines will be rendered with \r\n
while on other platforms they will be rendered with \n
.
Since v0.6.3
, platform specific line endings are activated though the default feature win_crlf
, which can be deactivated.
When this feature is deactivated (for instance with the --no-default-features
flag in cargo), line endings will be rendered with \n
on any platform.
This customization capability will probably move to Formatting API in v0.7
.
Additional examples are provided in the documentation and in examples directory.